<script setup>
  import { onMounted, ref } from 'vue'
  import axios from 'axios'
  import powerSet from './power-set'
  // 商品数据
  const goods = ref({})
  let pathMap = {}
  const getGoods = async () => {
    // 1135075  初始化就有无库存的规格
    // 1369155859933827074 更新之后有无库存项（蓝色-20cm-中国） 1109030
    const res = await axios.get('http://pcapi-xiaotuxian-front-devtest.itheima.net/goods?id=1369155859933827074')
    goods.value = res.data.result
    pathMap = getPathMap(goods.value)
    // console.log(pathMap);
    initDisabledStatus(goods.value.specs, pathMap)
  }
  onMounted(() => getGoods())

  const skuObj = ref({})
  //切换选中状态  item 同类型规格  val 当前选中项
  const changeSelectedStata = (item, val) => {
    if (val.disabled) {
      return
    }
    if (val.selected) {
      val.selected = false
    } else {
      item.values.forEach(i => i.selected = false)
      val.selected = true
    }
    //点击规格时更新禁用状态
    updateDisabledStatus(goods.value.specs, pathMap)
    //产出sku对象数据
    const index = getSelectedValues(goods.value.specs).findIndex(i => i === undefined)
    if (index > -1) {
      console.log('请选择完整');
    } else {
      console.log('获取sku对象数据');
      //获取sku对象
      const key = getSelectedValues(goods.value.specs).join('-')
      const skuIds = pathMap[key]
      console.log('skuIds', skuIds);
      //以skuId作为匹配项去goods.value.skus数组中找
      skuObj.value = goods.value.skus.find(g => g.id === skuIds[0])
      console.log(skuObj.value);
    }
  }

  //生成有效路径字典对象
  const getPathMap = (goods) => {
    const pathMap = {}
    //1、根据skus字段得到库存大于0的新的skus数组
    const effectiveSkus = goods.skus.filter(sku => sku.inventory > 0)
    //2、根据有效数据使用算法（子集算法）得到有效路径字典对象[1,2]=>[1],[2],[1,2]
    effectiveSkus.forEach(sku => {
      //2.1获取匹配的valueName组成的数组
      const selectValArr = sku.specs.map(val => val.valueName)
      //2.2使用算法获取子集
      const valueArrPowerSet = powerSet(selectValArr)
      //3、把得到的子集生成最终的路径字典对象
      valueArrPowerSet.forEach(arr => {
        //初始化key 数组join=》字符串   对象的key
        const key = arr.join('-')
        //如果已经存在当前的key，就往数组中直接添加skuId 如果不存在key 直接赋值
        if (pathMap[key]) {
          pathMap[key].push(sku.id)
        } else {
          pathMap[key] = [sku.id]
        }
      })
    })
    return pathMap
  }

  //初始化禁用状态
  const initDisabledStatus = (specs, pathMap) => {
    specs.forEach(spec => {
      spec.values.forEach(val => {
        if (pathMap[val.name]) {
          val.disabled = false
        } else {
          val.disabled = true
        }
      })
    })
  }

  //获取选中项的匹配数组
  const getSelectedValues = (specs) => {
    let arr = []
    specs.forEach(spec => {
      const selectedVal = spec.values.find(item => item.selected)
      arr.push(selectedVal ? selectedVal.name : undefined)
    })
    return arr
  }
  //切换时更新禁用状态
  const updateDisabledStatus = (specs, pathMap) => {
    specs.forEach((spec, index) => {
      const selectedArr = getSelectedValues(specs)
      spec.values.forEach(val => {
        selectedArr[index] = val.name
        const key = selectedArr.filter(value => value).join('-')
        if (pathMap[key]) {
          val.disabled = false
        } else {
          val.disabled = true
        }
      })
    })
  }
</script>

<template>
  <div class="goods-sku">
    <dl v-for="item in goods.specs" :key="item.id">
      <dt>{{ item.name }}</dt>
      <dd>
        <template v-for="val in item.values" :key="val.name">
          <!-- 图片类型规格 -->
          <img :class="{ selected: val.selected, disabled: val.disabled }" @click="changeSelectedStata(item, val)"
               v-if="val.picture" :src="val.picture" :title="val.name">
          <!-- 文字类型规格 -->
          <span :class="{ selected: val.selected, disabled: val.disabled }" @click="changeSelectedStata(item, val)"
                v-else>{{ val.name }}</span>
        </template>
      </dd>
    </dl>
  </div>
</template>

<style
  scoped
  lang="scss"
>
  @mixin sku-state-mixin {
    border: 1px solid #e4e4e4;
    margin-right: 10px;
    cursor: pointer;

    &.selected {
      border-color: #27ba9b;
    }

    &.disabled {
      opacity: 0.6;
      border-style: dashed;
      cursor: not-allowed;
    }
  }

  .goods-sku {
    padding-left: 10px;
    padding-top: 20px;

    dl {
      display: flex;
      padding-bottom: 20px;
      align-items: center;

      dt {
        width: 50px;
        color: #999;
      }

      dd {
        flex: 1;
        color: #666;

        >img {
          width: 50px;
          height: 50px;
          margin-bottom: 4px;
          @include sku-state-mixin;
        }

        >span {
          display: inline-block;
          height: 30px;
          line-height: 28px;
          padding: 0 20px;
          margin-bottom: 4px;
          @include sku-state-mixin;
        }
      }
    }
  }
</style>